import CryptoJS from 'crypto-js';
import uploadConfig from '@/config/upload';
import CityLinkageJson from '@/components/ma-cityLinkage/lib/city.json';

const typeColor = (type = 'default') => {
  let color = '';
  switch (type) {
    case 'default':
      color = '#35495E';
      break;
    case 'primary':
      color = '#3488ff';
      break;
    case 'success':
      color = '#43B883';
      break;
    case 'warning':
      color = '#e6a23c';
      break;
    case 'danger':
      color = '#f56c6c';
      break;
    default:
      break;
  }
  return color;
};

const tool = {};

/**
 * LocalStorage
 */
tool.local = {
  set(table, settings) {
    let _set = JSON.stringify(settings);
    const aesKey = import.meta.env.VITE_APP_AES_KEY;
    _set = tool.aes.encode(_set, aesKey);
    return localStorage.setItem(table, _set);
  },
  get(table) {
    let data = localStorage.getItem(table);
    try {
      const aesKey = import.meta.env.VITE_APP_AES_KEY;
      data = tool.aes.decode(data, aesKey);
      data = JSON.parse(data);
    } catch (err) {
      return null;
    }
    return data;
  },
  remove(table) {
    return localStorage.removeItem(table);
  },
  clear() {
    return localStorage.clear();
  },
};

/**
 * SessionStorage
 */
tool.session = {
  set(table, settings) {
    let _set = JSON.stringify(settings);
    return sessionStorage.setItem(table, _set);
  },
  get(table) {
    let data = sessionStorage.getItem(table);
    try {
      data = JSON.parse(data);
    } catch (err) {
      return null;
    }
    return data;
  },
  remove(table) {
    return sessionStorage.removeItem(table);
  },
  clear() {
    return sessionStorage.clear();
  },
};

/**
 * CookieStorage
 */
tool.cookie = {
  set(name, value, config = {}) {
    var cfg = {
      expires: null,
      path: null,
      domain: null,
      secure: false,
      httpOnly: false,
      ...config,
    };
    var cookieStr = `${name}=${escape(value)}`;
    if (cfg.expires) {
      var exp = new Date();
      exp.setTime(exp.getTime() + parseInt(cfg.expires) * 1000);
      cookieStr += `;expires=${exp.toGMTString()}`;
    }
    if (cfg.path) {
      cookieStr += `;path=${cfg.path}`;
    }
    if (cfg.domain) {
      cookieStr += `;domain=${cfg.domain}`;
    }
    document.cookie = cookieStr;
  },
  get(name) {
    var arr = document.cookie.match(
      new RegExp('(^| )' + name + '=([^;]*)(;|$)'),
    );
    if (arr != null) {
      return unescape(arr[2]);
    } else {
      return null;
    }
  },
  remove(name) {
    var exp = new Date();
    exp.setTime(exp.getTime() - 1);
    document.cookie = `${name}=;expires=${exp.toGMTString()}`;
  },
};

/* Fullscreen */
tool.screen = (element) => {
  let isFull = !!(
    document.webkitIsFullScreen ||
    document.mozFullScreen ||
    document.msFullscreenElement ||
    document.fullscreenElement
  );
  if (isFull) {
    if (document.exitFullscreen) {
      document.exitFullscreen();
    } else if (document.msExitFullscreen) {
      document.msExitFullscreen();
    } else if (document.mozCancelFullScreen) {
      document.mozCancelFullScreen();
    } else if (document.webkitExitFullscreen) {
      document.webkitExitFullscreen();
    }
  } else {
    if (element.requestFullscreen) {
      element.requestFullscreen();
    } else if (element.msRequestFullscreen) {
      element.msRequestFullscreen();
    } else if (element.mozRequestFullScreen) {
      element.mozRequestFullScreen();
    } else if (element.webkitRequestFullscreen) {
      element.webkitRequestFullscreen();
    }
  }
};

// 城市代码翻译成名称
tool.cityToCode = function (
  province,
  city = undefined,
  area = undefined,
  split = ' / ',
) {
  try {
    let provinceData = CityLinkageJson.filter(
      (item) => province == item.code,
    )[0];
    if (!city) {
      return provinceData.name;
    }
    let cityData = provinceData.children.filter((item) => city == item.code)[0];

    if (!area) {
      return [provinceData.name, cityData.name].join(split);
    }
    let areaData = cityData.children.filter((item) => area == item.code)[0];

    return [provinceData.name, cityData.name, areaData.name].join(split);
  } catch (e) {
    return '';
  }
};

/* 复制对象 */
tool.objCopy = (obj) => {
  if (obj === undefined) {
    return undefined;
  }
  return JSON.parse(JSON.stringify(obj));
};

tool.generateId = function () {
  return Math.floor(
    Math.random() * 100000 + Math.random() * 20000 + Math.random() * 5000,
  );
};

tool.viewImage = function (path, defaultStorage = 'LOCAL') {
  let mode = tool.local.get('site_storage_mode')
    ? tool.local.get('site_storage_mode').toUpperCase()
    : defaultStorage;
  return uploadConfig.storage[mode] + path;
};

tool.showFile = function (hash, defaultStorage = 'LOCAL') {
  if (hash.indexOf('.') !== -1) {
    return tool.viewImage(hash, defaultStorage);
  }
  let mode = tool.local.get('site_storage_mode')
    ? tool.local.get('site_storage_mode').toUpperCase()
    : defaultStorage;
  return uploadConfig.storage[mode] + '/system/showFile/' + hash;
};

/* 日期格式化 */
tool.dateFormat = (date, fmt = 'yyyy-MM-dd hh:mm:ss', isDefault = '-') => {
  if (date.toString().length == 10) {
    date = date * 1000;
  }
  date = new Date(date);

  if (date.valueOf() < 1) {
    return isDefault;
  }
  let o = {
    'M+': date.getMonth() + 1, //月份
    'd+': date.getDate(), //日
    'h+': date.getHours(), //小时
    'm+': date.getMinutes(), //分
    's+': date.getSeconds(), //秒
    'q+': Math.floor((date.getMonth() + 3) / 3), //季度
    S: date.getMilliseconds(), //毫秒
  };
  if (/(y+)/.test(fmt)) {
    fmt = fmt.replace(
      RegExp.$1,
      (date.getFullYear() + '').substr(4 - RegExp.$1.length),
    );
  }
  for (let k in o) {
    if (new RegExp('(' + k + ')').test(fmt)) {
      fmt = fmt.replace(
        RegExp.$1,
        RegExp.$1.length == 1 ? o[k] : ('00' + o[k]).substr(('' + o[k]).length),
      );
    }
  }
  return fmt;
};

/* 千分符 */
tool.groupSeparator = (num) => {
  num = num + '';
  if (!num.includes('.')) {
    num += '.';
  }
  return num
    .replace(/(\d)(?=(\d{3})+\.)/g, function ($0, $1) {
      return $1 + ',';
    })
    .replace(/\.$/, '');
};

tool.md5 = (str) => {
  return CryptoJS.MD5(str).toString();
};

tool.base64 = {
  encode(data) {
    return CryptoJS.enc.Base64.stringify(CryptoJS.enc.Utf8.parse(data));
  },
  decode(cipher) {
    return CryptoJS.enc.Base64.parse(cipher).toString(CryptoJS.enc.Utf8);
  },
};

tool.aes = {
  encode(data, secretKey) {
    const result = CryptoJS.AES.encrypt(
      data,
      CryptoJS.enc.Utf8.parse(secretKey),
      {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7,
      },
    );
    return result.toString();
  },
  decode(cipher, secretKey) {
    const result = CryptoJS.AES.decrypt(
      cipher,
      CryptoJS.enc.Utf8.parse(secretKey),
      {
        mode: CryptoJS.mode.ECB,
        padding: CryptoJS.pad.Pkcs7,
      },
    );
    return CryptoJS.enc.Utf8.stringify(result);
  },
};

tool.capsule = (title, info, type = 'primary') => {
  console.log(
    `%c ${title} %c ${info} %c`,
    'background:#35495E; padding: 1px; border-radius: 3px 0 0 3px; color: #fff;',
    `background:${typeColor(type)}; padding: 1px; border-radius: 0 3px 3px 0;  color: #fff;`,
    'background:transparent',
  );
};

tool.formatSize = (size) => {
  if (typeof size == 'undefined') {
    return '0';
  }
  let units = ['B', 'KB', 'MB', 'GB', 'TB', 'PB'];
  let index = 0;
  for (let i = 0; size >= 1024 && i < 5; i++) {
    size /= 1024;
    index = i;
  }
  return Math.round(size, 2) + units[index];
};

tool.download = (res, downName = '') => {
  const aLink = document.createElement('a');
  let fileName = downName;
  let blob = res; //第三方请求返回blob对象

  //通过后端接口返回
  if (res.headers && res.data) {
    blob = new Blob([res.data], {
      type: res.headers['content-type'].replace(';charset=utf8', ''),
    });
    if (!downName) {
      const contentDisposition = decodeURI(res.headers['content-disposition']);
      const result = contentDisposition.match(/filename\*=utf-8\'\'(.+)/gi);
      fileName = result[0].replace(/filename\*=utf-8\'\'/gi, '');
    }
  }

  aLink.href = URL.createObjectURL(blob);
  // 设置下载文件名称
  aLink.setAttribute('download', fileName);
  document.body.appendChild(aLink);
  aLink.click();
  document.body.removeChild(aLink);
  URL.revokeObjectURL(aLink.href);
};

/**
 * 对象转url参数
 * @param {*} data
 * @param {*} isPrefix
 */
tool.httpBuild = (data, isPrefix = false) => {
  let prefix = isPrefix ? '?' : '';
  let _result = [];
  for (let key in data) {
    let value = data[key];
    // 去掉为空的参数
    if (['', undefined, null].includes(value)) {
      continue;
    }
    if (value.constructor === Array) {
      value.forEach((_value) => {
        _result.push(
          encodeURIComponent(key) + '[]=' + encodeURIComponent(_value),
        );
      });
    } else {
      _result.push(encodeURIComponent(key) + '=' + encodeURIComponent(value));
    }
  }

  return _result.length ? prefix + _result.join('&') : '';
};

tool.getRequestParams = (url) => {
  const theRequest = new Object();
  if (url.indexOf('?') != -1) {
    const params = url.split('?')[1].split('&');
    for (let i = 0; i < params.length; i++) {
      const param = params[i].split('=');
      theRequest[param[0]] = decodeURIComponent(param[1]);
    }
  }
  return theRequest;
};

tool.attachUrl = (path, defaultStorage = 'LOCAL') => {
  return uploadConfig.storage[defaultStorage] + path;
};

/**
 * 获取token
 */
tool.getToken = () => {
  return tool.local.get('token');
};
/**
 * 转Unix时间戳
 */

tool.toUnixTime = (date) => {
  return Math.floor(new Date(date).getTime() / 1000);
};

tool.arrSum = (arr) => {
  let sum = 0;
  arr.map((item) => (sum += item));
  return sum;
};

export default tool;
